/**
 * 文件名：@T_01.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.test <br/>
 * 项目名：afw-mvc-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.test;

import java.beans.PropertyDescriptor;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

/**
 * 类名：T_01  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午2:21:26  <br />
 * @version 2015年12月4日
 */
public class T_01 {
	
	@Test
	public void _03() {
		System.out.println(Collections.max(Arrays.asList("490", "50", "3")));
	}

	@Test
	public void _01() throws Exception {
		
		Map<String, Object> values = new HashMap<String, Object>();
		
		values.put("user.name", "xt-win");
		
		//Object o = bind(User.class, "user", values);
		
		//System.out.println(o);
		
		User user = new User();
		
		bind(user, "name", "xt-win");
		bind(user, "parent.name", "xt-win");
		
		System.out.println(user);
	}
	
	protected void bind(Object inst, String netsted, Object value) throws Exception {
		int index = netsted.indexOf('.');
		
		String property = netsted;
		
		if (index != -1) {
			property = netsted.substring(0, index);
			
			netsted = netsted.substring(index + 1);
		}
		
		// 创建属性描述
		PropertyDescriptor pdesc = new PropertyDescriptor(property, inst.getClass());
		
		Object _v = value;
		if (index != -1) {
			// 复杂类型，要递归处理
			//_v = bind(pdesc.getReadMethod().invoke(inst), pdesc.getPropertyType(), netsted, value);
			
			_v = pdesc.getReadMethod().invoke(inst);
			
			if (null == _v) {
				_v = pdesc.getPropertyType().newInstance();
			}
			
			bind(_v, netsted, value);
		}
		
		pdesc.getWriteMethod().invoke(inst, _v);
	}
	
	/*protected Object bind(Class<?> type, String prefix, Map<String, Object> values) throws Exception {
		
		if (type.isPrimitive() || type == String.class) {
			// 基础类型
			return values.get(prefix);
		}
		
		PropertyDescriptor[] descs = Introspector.getBeanInfo(type, Object.class).getPropertyDescriptors();
		
		Object inst = type.newInstance();
		
		for (PropertyDescriptor desc : descs) {
			
			// 取出属性名
			String name = desc.getName();
			
			// 递归调用，处理复杂类型
			Object _value = bind(desc.getPropertyType(), prefix + "." + name, values);
			
			if (null != _value) {
				// 将参数值写入到对象中
				desc.getWriteMethod().invoke(inst, _value);
			}
		}
		
		return inst;
	}*/
}
